import Vue from "vue";
import axios from 'axios'
import nProgress from "nprogress";

let url = "";

if (process.env.VUE_APP_URL == "production") {
  url = process.env.VUE_APP_BASE_API; 
}

// const service = axios.create({
//   // 公共接口--这里注意后面会讲
//   baseURL:config.baseURL,// process.env.BASE_API,
//   // 超时时间 单位是ms，这里设置了3s的超时时间
//   timeout: 50 * 1000
// })

// 2.创建axios对象
const service = axios.create({
  baseURL: url, //如果配置了环境变量就可以直接写/api
  
});

// 3.设置请求拦截器
service.interceptors.request.use(
  (config) => {
    // config.url = encodeURI(config.baseURL + '/test')
    //         config.headers = {
    //             "content-type": "application/json",
    //             "accept": 'application/json, text/plain, */*',
    //         }
    // config.headers['content-type'] = 'application/x-www-form-urlencoded'

    //每次发送请求要进行的公共操作  每次发送请求一般需要的操作一般都有 开启loading加载动画 token写在请求的头部 之类的
    config.headers.Authorization = window.sessionStorage.getItem("token");
    nProgress.start();
    
    //最后的话一定要给他return出去 不return不执行
    return config;
  },
  (err) => {
    console.log(err)
    //请求的时候如果发生错误了， 这边直接给它抛出错误就行
    // throw new Error(err)抛出的是一个红色的报错方便我们查看寻找
    throw new Error(err);
  }
);

//4. 设置响应拦截器
service.interceptors.response.use(
  (response) => {
    //我们每次成功发送一个请求 它都会有响应的 参数也是两个
    //判断状态码
    // res是响应的结果
    const res = response.data.meta.status;
    console.log(res)
    switch (res) {
      case 401:
        // 登录失效
        // 响应成功的拦截
        console.log("响应拦截器：");
        Vue.prototype.$message.error(response.data.msg);
        window.sessionStorage.removeItem("token");
        router.push("/login");
        break;
      case 404:
        if (response.data.meta.msg !== null) {
          Vue.prototype.$message.error(response.data.msg);
        } else {
          Vue.prototype.$message.error("未知错误");
        }
        break;
      case 500:
        // 错误
        if (response.data.msg !== null) {
          Vue.prototype.$message.error(response.data.msg);
        } else {
          Vue.prototype.$message.error("未知错误");
        }
        break;
      case 200:
          nProgress.done();
        break;
      case 201:
        nProgress.done();
        break;
      default:
        return Vue.prototype.$message.error("操作失败");
    }
    return response;
  },
  (err) => {
    return Promise.reject(err);
  }
);

//导出  导出这个模块
export default service;
